package com.tedu.review.day02;

/**
 *   普通类  √
 *   抽象类=抽象方法    关键字    abstract
 *   只有行为的概念，没有具体实现行为
 *
 *   与面向对象的多态有绝对关系
 *   产生子类【实现类】同时具备实现的属性和方法
 *
 *   什么下情况时使用？
 *   复杂项目时，需要在不同类中实现，不同功能，首选抽象类【Android】
 *
 *   、定义抽象类：
 *   修饰符    abstract class 类名{}    抽象类本身没有任何意义
 *   创建抽象类同时必须存在抽象方法：
 *   修饰符  abstract  返回值  方法名（）;   定义抽象的方法，提供给子类的使用
 *
 *   抽象类实例化：
 *   必须使用多态，向上造型，自身无法实例化，子类【实现类】
 *
 *   定义        使用        注意
 *
 *   抽象类使用注意：抽象类和抽象方法必须使用abstract关键字修饰
 *               可以定义静态属性、静态方法需要加空{}，不可以定义抽象属性
 *               可以存在构造器、不可以定义静态抽象方法、不可以静态抽象属性
 *               可以存在内部类：静态内部类，抽象类继承抽象类
 *               Java只允许单继承，实现只需要继承子抽象类
 *               final不能修饰抽象方法
 *
 */
abstract class Animals{    //1.可以使用static修饰   √
    //类的定义：   修饰符   [abstract| static]  class  类名{}
    public abstract void say();//抽象方法：没有任何实现
    //2.定义修饰final[锁死]的抽象方法   X
  //  public final abstract void sleep();
    //3.定义抽象属性 X|定义静态属性 √
    //abstract int i;
    static int i;//声明未赋值
    //4.定义抽象静态属性    X
    // abstract static int j;
    // 5.定义静态抽象方法   语法:修饰符[static | abstract]返回值   方法名
   // public static abstract void eat();
    //6.定义静态方法  √    需要代码块{}  一定空   实现类不需要一定实现
    public static void eat(){};
    //7.可以存在内部类，可以存在静态内部类  √
    public static class Sos{}
    //8.构造器--抽象类构造存在    √

    public Animals() {
    }

}
//9.抽象类可以继承抽象类    √ 可以
abstract class Thing extends Animals{
    //成员变量
    protected abstract int result();
}


//实现类：子类   继承  抽象类   完成：抽象方法
//10.实现类【子类】继承俩抽象类   X   但是，实现最终继承[子】抽象类    单继承
class People extends Animals{
    public void say() {
        System.out.println("人---说话~~");

    }
}
//实现类：假设 Animals  有俩抽象方法   请问：子类需要实现抽象类全部抽象方法
class Monkey extends Animals{
    public void say() {
        System.out.println("猴--说话~~");
    }
}

public class 抽象类 {
    public static void main(String[] args) {
        //抽象---实例化【创建对象：不能直接创建】--多态:向上造型
        Animals a=new People();
        a.say();   //输出:重写后的值    【方法互通】
        //实现抽象实例化
        Animals a1=new Monkey();
        a1.say();//输出：重写后的值     【方法互通】
    }
}
